<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script type="text/javascript">
        //1.将函数作为另一个函数的返回值
        function fn1()
        {
            //在给a赋值2的时候，闭包就已经产生（函数提升）
            //流程是 变量a定义==》函数fn2()定义==》变量a赋值，所以可以得出在最后一步变量a赋值之前就已经产生了闭包
            var a=2;
            function fn2()
            {
                a++;
                console.log("fn2()函数执行后的值"+a);
            }
            return fn2;
        }
        var f=fn1();
        console.log(f());//3
        console.log(f());//4

        var g=fn1();
        console.log(g());//3
        console.log(g());//4
        //f和g的执行不会产生闭包，闭包的产生取决于原外部函数执行几次

        //如何让函数死亡，从而使得闭包成为垃圾对象
        f=null;//闭包死亡（包含闭包的函数对象成为垃圾对象）
        //console.log(f,f());这样f就已经死亡了
    </script>
</head>
<body>
    <!--
        1.产生：在嵌套内部函数定义执行完时就产生了（不是在调用）
        2.死亡：在嵌套的内部函数成为垃圾对象时
    -->
</body>
</html>